package com.webserver.core;

import com.webserver.servlet.*;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 存放所有服务端需要重用的内容
 */
public class ServerContext {
    /**
     * 存放所有请求路径与处理该请求的Servlet
     */
    private static Map<String, HttpServlet> servletMapping = new HashMap<>();

    static {
        initServletMapping();
    }

    private static void initServletMapping() {
//        servletMapping.put("/myweb/regUser",new RegServlet());
//        servletMapping.put("/myweb/loginUser",new LoginServlet());
//        servletMapping.put("/myweb/showAllUser",new ShowAllUserServlet());
//        servletMapping.put("/myweb/toUpdateServlet",new ToUpdateServlet());
        /*
            解析config/servlets.xml初始化servletMapping
            将根标签下所有的<servlet>标签获取到，将其中的属性:
            path的值作为key
            className的值利用反射加载对应的类，并进行实例化，将实例化后的对象作为value
            存入到servletMapping中完成初始化。

            Element提供了一个方法，可以获取当前标签中指定属性的值
            String attributeValue(String name)

            假如e表示的是一个<servlet path="xxx" className="xxx">标签
            e.attributeValue("path")可以获取到path属性的值
         */
        try {
            SAXReader reader = new SAXReader();
            Document doc = reader.read("./config/servlets.xml");
            Element root = doc.getRootElement();
            List<Element> list = root.elements("servlet");
            for(Element e : list){
                String key = e.attributeValue("path");
                String className = e.attributeValue("className");
                Class cls = Class.forName(className);
                HttpServlet servlet = (HttpServlet) cls.newInstance();
                servletMapping.put(key,servlet);
            }
            System.out.println(servletMapping);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

    }
    public static HttpServlet getServlet(String path) {
        return servletMapping.get(path);
    }
}
